/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ejb;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.ejb.Stateless;

/**
 *
 * @author Cuchu
 */
@Stateless
public class GestoreRecensioniBean implements GestoreRecensioniBeanLocal {
    @EJB
    private RecensioneInternaFacadeLocal recensioneInternaFacade;
    @EJB
    private RecensioneEsternaFacadeLocal recensioneEsternaFacade;
    @EJB
    private VotoFacadeLocal votoFacade;
   /**
    * Aggiunge una RecensioneInterna al Database
    * @param titolo il titolo della RecensioneInterna
    * @param pro lista che contiene i pro ai Videogames da parte dalla RecensioneInterna
    * @param contro lista che contiene i contro ai Videogames da parte dalla RecensioneInterna
    * @param data data di inserimento
    * @param autore il recensore creatore della RecensioneInterna
    * @param vg lista dei Videogames a cui la RecensioneInterna fa riferimento
    * @param testo Path o percorso dove si trova il Testo della RecensioneInterna
    * @param immagini lista dei path degli immagini
    * @return RecensioneInterna RecensioneInterna nuova inserita, null altrimenti
    */ 
    @Override
    public RecensioneInterna aggiungiRecensioneInterna(String titolo,List<String>pro,List<String> contro,Date data,Utente autore,List<Videogame> vg,String testo,List<String> immagini) {
        RecensioneInterna r;
        if (recensioneInternaFacade.find(titolo)==null){
             r=new RecensioneInterna();
            r.setAutore(autore);
            r.setData(data);
            r.setImmagini(immagini);
            r.setTesto(testo);
            r.setVideogiochi(vg);
            r.setTitolo(titolo);
            r.setContro(contro);
            r.setPro(pro);
            recensioneInternaFacade.create(r); 
            return r;
        }
        return null;
    }
   /**
    * Aggiunge una RecensioneEsterna al Database
    * @param vg lista dei Videogames a cui la RecensioneInterna fa riferimento
    * @param scala la scala del Voto della RecensioneEsterna
    * @param valutazione la valutazione del Voto della RecensioneEsterna
    * @param url l'url dal quale viene fatta la RecensioneEsterna
    * @param autore il recensore creatore della RecensioneEsterna
    * @return RecensioneEsterna RecensioneEsterna nuova inserita, null altrimenti
    */ 
    @Override
    public RecensioneEsterna aggiungiRecensioneEsterna(List<Videogame> vg, int scala, double valutazione, String url,Utente autore) {
        RecensioneEsterna r;
        if (recensioneEsternaFacade.find(url)==null){
            r= new RecensioneEsterna ();
            r.setUrl(url);
            r.setVideogiochi(vg);
            r.setAutore(autore);
            Voto v;
            if ((v=votoFacade.find(scala,valutazione))==null) {
                    v=new Voto();
                    v.setScala(scala);
                    v.setValutazione(valutazione);
                    votoFacade.create(v);
            }
            r.setVoto(v);
            recensioneEsternaFacade.create(r); 
            return r;
        }
        return null;
    }
    /**
    * Modifica una RecensioneEsterna del Database
    * @param scala la scala del Voto della RecensioneEsterna
    * @param valutazione la valutazione del Voto della RecensioneEsterna
    * @param url l'url dal quale viene fatta la RecensioneEsterna
    * @return RecensioneEsterna se viene modificata, null altrimenti
    */ 
    @Override
    public RecensioneEsterna modificaRecensioneEsterna(int scala, double valutazione, String url) {
        
        RecensioneEsterna r= recensioneEsternaFacade.find(url);
        Voto v;
        
        if ((scala!=0)&&(valutazione!=0)){
            if ((v=votoFacade.find(scala,valutazione))==null) {
                    v=new Voto();
                    v.setScala(scala);
                    v.setValutazione(valutazione);
                    votoFacade.create(v);
            }
            v.setScala(scala);
            v.setValutazione(valutazione);
            r.setVoto(v);
        }
        recensioneEsternaFacade.edit(r);
        return r;
    }
    /**
    * Modifica una RecensioneInterna del Database
    * @param titolo il titolo della RecensioneInterna
    * @param pro lista che contiene i pro ai Videogames da parte dalla RecensioneInterna
    * @param contro lista che contiene i contro ai Videogames da parte dalla RecensioneInterna
    * @param testo Path o percorso dove si trova il Testo della RecensioneInterna
    * @param immagini lista dei path degli immagini
    * @return RecensioneInterna se viene modificata, null altrimenti
    */ 
    @Override
    public RecensioneInterna modificaRecensioneInterna(String titolo,List<String>pro,List<String> contro,String testo,List<String> immagini){
        
        RecensioneInterna r=getRecensioneInterna(titolo);
            
        //System.out.println("sono dentro al modifica edit rec interna");
        r.setImmagini(immagini);
        r.setPro(pro);
        r.setContro(contro);
     
        r.setTesto(testo);
        
        recensioneInternaFacade.edit(r);
        return r;
    }

    /**
     * Cerca la RecensioneInterna con uno specifico titolo nel Database
     *
     * @param titolo il titolo della RecensioneInterna da cercare
     * @return RecensioneInterna la RecensioneInterna con il specifico titolo, null altrimenti
     */
    @Override
    public RecensioneInterna getRecensioneInterna(String titolo){
        return recensioneInternaFacade.find(titolo);
    }
    /**
     * Cerca la RecensioneEsterna con uno specifico url nel Database
     *
     * @param url l'url dal quale viene fatta la RecensioneEsterna
     * @return RecensioneEsterna la RecensioneEsterna con il specifico url, null altrimenti
     */
    @Override
    public RecensioneEsterna getRecensioneEsterna(String url){
        return recensioneEsternaFacade.find(url);
    
    }
   /**
    * Cerca tutte le RecensioneInterne nel Database 
    * @return List<RecensioneInterna> lista delle RecensioneInterne trovate, altrimenti restituisce una lista vuota
    */ 
    @Override
    public List<RecensioneInterna> visualizzaRecensioniInterne() {
        return recensioneInternaFacade.findAll();
    }
   /**
    * Cerca tutte le RecensioneEsterne nel Database 
    * @return List<RecensioneEsterna> lista delle RecensioneEsterne trovate, altrimenti restituisce una lista vuota
    */ 
    @Override
    public List<RecensioneEsterna> visualizzaRecensioniEsterne() {
        return recensioneEsternaFacade.findAll();
    }

    /**
     * Trova tutte le RecensioneInterne presente nel Database
     *
     * @param titolo sottostringa da cercare tra tutti i titoli delle RecensioneInterne
     * presenti nel Database
     * @param text sottostringa da cercare nei testi delle RecensioneInterne presenti nel
     * Database
     * @param platform lista dei nomi delle piattaforme da cercare tra tutte le piattaforme delle
     * RecensioneInterne presente nel Database
     * @param data data della pubblicazione delle RecensioneInterne da cercare
     * @return Elenco delle RecensioneInterne, altrimenti restituisce una lista vuota
     */
    @Override
    public List<RecensioneInterna> search(String titolo,String text,List<String> platform,String data) throws FileNotFoundException, IOException {
        
            return recensioneInternaFacade.findSome(titolo,text,platform,data);
    }
    /**
     * Cerca la RecensioneInterna con uno specifico idRecensione nel Database
     * @param idRecensione l'identificativo della RecensioneInterna da cercare
     * @return RecensioneInterna la RecensioneInterna con il specifico id, null altrimenti
     */
    @Override
    public RecensioneInterna trova(long idRecensione) {
        return recensioneInternaFacade.find(idRecensione);
    }
   /* Rimuove una RecensioneInterna dal Database
    * @param recensione la RecensioneInterna da rimuovere
    * @return boolean true se la RecensioneInterna viene rimossa correttamente, false altrimenti
    */
    @Override
    public boolean eliminaRecensioneInterna(RecensioneInterna recensione) {
       if (!recensioneInternaFacade.esistente(recensione))
           return false;
        recensioneInternaFacade.remove(recensione);
        return true;
    }
    /**
     * Cerca la RecensioneEsterna con uno specifico id nel Database
     * @param idRecensione l'identificativo della RecensioneEsterna da cercare
     * @return RecensioneEsterna la RecensioneEsterna con il specifico id, null altrimenti
     */
    @Override
    public RecensioneEsterna trovaEsterna(long idRecensione) {
        return recensioneEsternaFacade.find(idRecensione);
    }
   /* Rimuove una RecensioneEsterna dal Database
    * @param recensione la RecensioneEsterna da rimuovere
    * @return boolean true se la RecensioneEsterna viene rimossa correttamente, false altrimenti
    */
    @Override
    public boolean eliminaRecensioneEsterna(RecensioneEsterna recensione) {
        if (!recensioneEsternaFacade.esistente(recensione))
           return false;
        recensioneEsternaFacade.remove(recensione);
        return true;
    }
    /**
     * Ricerca le RecensioneEsterne il cui identificativo del videogame matcha con uno dei quelli del parametro videogiochi nel Database
     * @param videogiochi lista dei Videogames di ricerca
     * @return List<RecensioneEsterna> lista delle RecensioneEsterne che soddisfano la ricerca, altrimenti restituisce una lista vuota 
     */
    @Override
    public List<RecensioneEsterna> getRecensioniEsterne(List<Videogame> videogiochi) {
        List<RecensioneEsterna> re=new ArrayList<RecensioneEsterna>();
        List<RecensioneEsterna> prov;
        for (Videogame v:videogiochi){
            prov=recensioneEsternaFacade.findForVideogame(v);
            if (prov!=null) re.addAll(prov);
        }
        return re;
    }
    
    
    
    
}
